<?php
namespace App\Api\Autojs;

use PhalApi\Api;
use PhalApi\Exception\BadRequestException;

/**
 * tk接口
 * @desc 提供盒马相关数据的增删改查接口
 */
class Tiktok extends Api {
    public function getRules() {
        return array(
            'spiders' => array(),
            'spiders_video' => array(),
            'spiders_comment' => array(),
            'send' => array()
        );
    }


    /**
     * 数据发送（带签名验证）
     * @desc tk数据同步，包含HMAC-SHA256签名验证
     * @param mixed $data 需要发送的业务数据
     * @return array 目标接口响应结果
     * @throws BadRequestException 配置缺失或签名计算失败时抛出异常
     */
    function send($data) {
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
        header('Access-Control-Allow-Headers: *');

        // 从配置获取必要参数（需提前在配置文件中设置）
        $appId = \PhalApi\DI()->config->get('app.tiktok_app_id', 'EC123456'); // 若配置未设置则默认使用EC123456
        $secretKey = \PhalApi\DI()->config->get('app.tiktok_secret_key', 'a@efBA#f%$QWFPk@adavzj123');
        if (empty($appId) || empty($secretKey)) {
            throw new BadRequestException('缺少必要配置：tiktok_app_id或tiktok_secret_key未设置');
        }

        // 生成时间戳（10位秒级）
        $timestamp = time();

        // 构造请求体并处理格式（去除空格/换行）
        $postData = ['data' => $data];
        $requestBody = json_encode($postData, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
        $requestBody = str_replace([" ", "\n", "\r"], '', $requestBody);

        // 计算HMAC-SHA256签名
        $signString = "X-AppID=$appId&X-Timestamp=$timestamp&body=$requestBody";
        $sign = hash_hmac('sha256', $secretKey, $signString);
        if (!$sign) {
            throw new BadRequestException('签名计算失败');
        }

        $curl = new \PhalApi\CUrl();
        // 设置请求头部（包含签名信息）
        $curl->setHeader(array(
            'Content-Type' => 'application/json',
            'X-AppID' => $appId,
            'X-Timestamp' => $timestamp,
            'X-Sign' => $sign
        ));
        // 设置请求的 URL
        $url = 'http://1.15.122.129:5000/api/v1/products/daily';

        $postData = ['data' => $data];

        $rs = $curl->post($url, json_encode($postData), 6000);
        return [ 
            
            'appID' => $appId,
            'secretKey' => $secretKey,
            'timestamp' => $timestamp,
            'postData' => json_encode($postData), 
            'signString' => $signString, 
            'sign' => $sign, 
            'msg' => json_decode($rs)
        
        ];
    }

    /**
     * 添加/更新数据
     * @desc 处理hmsshuju表数据
     * @return array 操作结果
     * @exception 400 参数错误
     */
    public function spiders()
    {
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
        header('Access-Control-Allow-Headers: *');

        $json = file_get_contents('php://input');
        if (empty($json)) {
            throw new BadRequestException('请求体不能为空');
        }
        $obj = json_decode($json, true);
        if (json_last_error() !== JSON_ERROR_NONE) {
            throw new BadRequestException('JSON格式错误: ' . json_last_error_msg());
        }        
        // 验证必要字段
        if (empty($obj['title'])) {
            throw new BadRequestException('title字段不能为空');
        }
        
        // 转义特殊字符
        $obj = array_map(function($value) {
            return is_string($value) ? addslashes($value) : $value;
        }, $obj);

        // 提取价格中的数字部分（如¥35.8/罐提取35.8）
        // preg_match('/(\d+\.?\d*)/', $obj['price'], $priceMatches);
        // $priceNum = isset($priceMatches[1]) ? floatval($priceMatches[1]) : 0;
        // $int_price = (float)sprintf('%.2f', $priceNum); // 直接保留两位小数并转换为浮点数
        // if($int_price){
        //     $obj['int_price'] = number_format($int_price, 2, '.', ''); // 格式化为两位小数的字符串（无千位分隔符）
        // }
        
        $obj['update_time'] = date('Y-m-d H:i:s');
        $obj['date'] = date('Y-m-d', time());
        try {
            $where = [
                'date' => date('Y-m-d', time()), // 假设日期字段为'date
                'title' => $obj['title'],
                'shop' => $obj['shop']
            ];
            $existing = \PhalApi\DI()->notorm->auto_tiktok->where($where)->fetchOne();
            if ($existing) {
                $existing['update_time'] = date('Y-m-d H:i:s', time());
                $obj['count'] = $existing['count'] + 1;
                \PhalApi\DI()->notorm->auto_tiktok->where('id', $existing['id'])->update($obj);
                // return ['code' => 1, 'msg' => '更新成功', 'data' => ['id' => $existing['id']]];
                $data = array(
                    $obj
                );
                return $this->send($data);
            }
            $obj['create_time'] = date('Y-m-d H:i:s');
            $id = \PhalApi\DI()->notorm->auto_tiktok->insert($obj);
            // return ['code' => 1, 'msg' => '创建成功', 'data' => ['id' => $id]];
        } catch (\Exception $e) {
            throw new BadRequestException($e->getMessage());
        }

        $data = array(
            $obj
        );
            
        return $this->send($data);
    }


    /**
     * 添加/更新数据
     * @desc 处理hmsshuju表数据
     * @return array 操作结果
     * @exception 400 参数错误
     */
    public function spiders_video()
    {
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
        header('Access-Control-Allow-Headers: *');

        $json = file_get_contents('php://input');
        if (empty($json)) {
            throw new BadRequestException('请求体不能为空');
        }
        $obj = json_decode($json, true);
        if (json_last_error() !== JSON_ERROR_NONE) {
            throw new BadRequestException('JSON格式错误: ' . json_last_error_msg());
        }        
        // 验证必要字段
        if (empty($obj['title'])) {
            throw new BadRequestException('title字段不能为空');
        }
        
        // 转义特殊字符
        $obj = array_map(function($value) {
            return is_string($value) ? addslashes($value) : $value;
        }, $obj);

        // 提取价格中的数字部分（如¥35.8/罐提取35.8）
        // preg_match('/(\d+\.?\d*)/', $obj['price'], $priceMatches);
        // $priceNum = isset($priceMatches[1]) ? floatval($priceMatches[1]) : 0;
        // $int_price = (float)sprintf('%.2f', $priceNum); // 直接保留两位小数并转换为浮点数
        // if($int_price){
        //     $obj['int_price'] = number_format($int_price, 2, '.', ''); // 格式化为两位小数的字符串（无千位分隔符）
        // }
        
        $obj['update_time'] = date('Y-m-d H:i:s');
        $obj['date'] = date('Y-m-d', time());
        try {
            $where = [
                'date' => date('Y-m-d', time()), // 假设日期字段为'date
                'v_author' => $obj['v_author'],
                'title' => $obj['title'],
                'shop' => $obj['shop']
            ];
            $existing = \PhalApi\DI()->notorm->auto_tiktok_video->where($where)->fetchOne();
            if ($existing) {
                $existing['update_time'] = date('Y-m-d H:i:s', time());
                $obj['count'] = $existing['count'] + 1;
                \PhalApi\DI()->notorm->auto_tiktok_video->where('id', $existing['id'])->update($obj);
                // return ['code' => 1, 'msg' => '更新成功', 'data' => ['id' => $existing['id']]];
                $data = array(
                    $obj
                );
                return $this->send($data);
            }
            $obj['create_time'] = date('Y-m-d H:i:s');
            $id = \PhalApi\DI()->notorm->auto_tiktok_video->insert($obj);
            // return ['code' => 1, 'msg' => '创建成功', 'data' => ['id' => $id]];
        } catch (\Exception $e) {
            throw new BadRequestException($e->getMessage());
        }

        $data = array(
            $obj
        );
            
        return $this->send($data);
    }


    /**
     * 添加/更新数据
     * @desc 处理hmsshuju表数据
     * @return array 操作结果
     * @exception 400 参数错误
     */
    public function spiders_comment()
    {
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
        header('Access-Control-Allow-Headers: *');

        $tableName = 'autox_tiktok_cm';

        $json = file_get_contents('php://input');
        if (empty($json)) {
            throw new BadRequestException('请求体不能为空');
        }
        $obj = json_decode($json, true);
        if (json_last_error() !== JSON_ERROR_NONE) {
            throw new BadRequestException('JSON格式错误: ' . json_last_error_msg());
        }        
        // 验证必要字段
        if (empty($obj['content'])) {
            throw new BadRequestException('content字段不能为空');
        }
        
        // 转义特殊字符
        $obj = array_map(function($value) {
            return is_string($value) ? addslashes($value) : $value;
        }, $obj);

        // 提取价格中的数字部分（如¥35.8/罐提取35.8）
        // preg_match('/(\d+\.?\d*)/', $obj['price'], $priceMatches);
        // $priceNum = isset($priceMatches[1]) ? floatval($priceMatches[1]) : 0;
        // $int_price = (float)sprintf('%.2f', $priceNum); // 直接保留两位小数并转换为浮点数
        // if($int_price){
        //     $obj['int_price'] = number_format($int_price, 2, '.', ''); // 格式化为两位小数的字符串（无千位分隔符）
        // }
        
        $obj['update_time'] = date('Y-m-d H:i:s');
        $obj['date'] = date('Y-m-d', time());
        try {
            $where = [
                'shop' => $obj['shop'], // 假设日期字段为'date
                'content' => $obj['content'],
            ];
            $existing = \PhalApi\DI()->notorm->$tableName->where($where)->fetchOne();
            if ($existing) {
                $existing['update_time'] = date('Y-m-d H:i:s', time());
                $obj['count'] = $existing['count'] + 1;
                \PhalApi\DI()->notorm->$tableName->where('id', $existing['id'])->update($obj);
                // return ['code' => 1, 'msg' => '更新成功', 'data' => ['id' => $existing['id']]];
                $data = array(
                    $obj
                );
                return $this->send($data);
            }
            $obj['create_time'] = date('Y-m-d H:i:s');
            $id = \PhalApi\DI()->notorm->$tableName->insert($obj);
            // return ['code' => 1, 'msg' => '创建成功', 'data' => ['id' => $id]];
        } catch (\Exception $e) {
            throw new BadRequestException($e->getMessage());
        }

        $data = array(
            $obj
        );
            
        return $this->send($data);
    }



}